Using slideToggle with Knockout’s MVVM
I recommend you use the third option: Option 3 – Boolean binding using a custom binding handler called slideToggle
See it live here: http://plnkr.co/edit/1YGchAyjkNSjYzmXFfK2
<!-- Step 1a - Create the HTML File or the View -->
<!DOCTYPE html>
<html>
<head>
<!-- Step 2 - Include jquery and knockout -->
<script type="text/javascript" src="http://code.jquery.com/jquery-latest.pack.js"></script>
<script type="text/javascript" src="http://knockoutjs.com/downloads/knockout-3.0.0.js"></script>
<!-- Step 3 - Add script to run when page loads -->
<script type="text/javascript">
$(document).ready(function(){
<!-- Step 4 - Create a ViewModel -->
function viewModel() {
_self = this;
_self.showHideChild = function(viewModel, event) {
$(event.currentTarget).children('div').slideToggle()
};
_self.showHideNextSibling = function(viewModel, event) {
var siblings = $(event.currentTarget).siblings('div');
for (var i=0;i<siblings.length;i++) {
if (siblings[i].previousElementSibling == event.currentTarget ) {
$(siblings[i]).slideToggle();
}
}
};
_self.isVisible = ko.observable(false);
_self.showHide = function() {
_self.isVisible(!_self.isVisible());
}
};
ko.bindingHandlers.slideToggle = {
init: function (element, valueAccessor) {
var value = valueAccessor();
$(element).toggle(ko.utils.unwrapObservable(value));
},
update: function (element, valueAccessor) {
var value = valueAccessor();
var isVisible = element.offsetWidth > 0 && element.offsetHeight > 0;
if (ko.utils.unwrapObservable(value) != isVisible) {
$(element).slideToggle();
}
}
};
<!-- Step 5 - Activates knockout.js bindings -->
ko.applyBindings(new viewModel());
});
</script>
</head>
<!-- Step 4 - Create a HTML Elements with bindings -->
<body style="">
<div>
Option 1 - Child div
<div id="child1" data-bind="click: showHideChild" style="border:2px solid;">
Click me
<div id="child2" style="display: none;">
Now you see me!
</div>
</div>
Option 2 - Siblings div
<div id="sib1" style="border:2px solid;">
<div id="sib2" data-bind="click: showHideNextSibling" >
Click me
</div>
<div id="sib3" style="display: none;">
Now you see me!
</div>
<div id="sib4">
You should always see me.
</div>
</div>
Option 3 - Boolean binding using a custom binding handler called slideToggle
<div id="bool1" style="border:2px solid;">
<div id="bool2" data-bind="click: showHide" >
Click me
</div>
<div id="bool3" data-bind="slideToggle: isVisible">
Now you see me!
</div>
</div>
</div>
</body>
</html>


Excellent! Thanks for the help!